package com.dc.ftp;

import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.*;
import android.support.v7.app.AppCompatActivity;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;

import android.widget.Toast;
import com.dc.ftp.base.SPBaseActivity;
import com.dc.ftp.broadcast.NetWorkStatusBroadcastReceiver;
import com.dc.ftp.global.Default;
import com.dc.ftp.http.BaseHttpClient;
import com.dc.ftp.http.JsonBuilder;
import com.dc.ftp.http.JsonHttpResponseHandler;
import com.dc.ftp.utils.MyLog;
import com.squareup.picasso.Callback;
import com.squareup.picasso.Picasso;

import org.apache.http.Header;
import org.json.JSONException;
import org.json.JSONObject;

/**
 * 程序入口activity
 */
public class MainLogoActivity extends SPBaseActivity implements View.OnClickListener {

    private SharedPreferences sharedPreferences;
    private ImageView startPic;
    private Button mSendPhoneNum;
    private MainLogoActivity.TimeCount time;
    private Handler handler;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        //activity的生命周期离开可见阶段,或失去焦点,activity可能被进程终止了.被kill,此时需要一种机制
        //能保存当时的状态,这就是savedInstanceState.确保activity在被kill之前，它可以调用onSaveInstanceState()来保存当前activity的状态信息（在paused状态时，要被KILLED的时候）
        super.onCreate(savedInstanceState);
        //setContentView()一旦调用，layout会立刻显示UI;而inflate只会把Layout形成一个以view类实现成的对象，有需要时再用setContentView(view)显示出来
        setContentView(R.layout.activity_main);
        startPic = (ImageView) findViewById(R.id.startPic);
        mSendPhoneNum = (Button) findViewById(R.id.sendphonenum);
        mSendPhoneNum.setOnClickListener(this);
        //setVisibility修改视图的可见性View.
        // VISIBLE ===>设置控件可见，这个很容易理解
        //View.INVISIBLE===>设置控件不可见，但这个View仍然会占用在xml文件中所分配的布局空间，不重新layout 布局
        //View.GONE===>设置控件不可见，但这个View在ViewGroup中不保留位置，会重新layout布局，不再占用空间，其后面
        mSendPhoneNum.setVisibility(View.INVISIBLE);
        mSendPhoneNum.setClickable(false); //禁止点击
        //SharedPreferences 本身是一个接口，用来获取和修改程序的配置数据,
        // 程序无法直接创建SharedPreferences实例,
        // 只能通过conext的getSharedPreferences(String, int)的获取接口实例,第一个参数,preferences文件,第二个
        // MODE_PRIVATE：指定该SharedPreferences数据只能被本应用程序或者是拥有相同user ID的应用读、写(写入的内容会覆盖原文件的内容)
        //MODE_WORLD_WRITEABLE:指定该SharedPreferences数据能被其它应用程序读，写
        //MODE_APPEND:判断是否有该文件，如果有在后面添加，而不是擦除
        sharedPreferences = getSharedPreferences("lmq", MODE_PRIVATE);

        if (!sharedPreferences.contains("fist_into")) { //判断当前preferences是否包含key所对应的数据
            //为preferences创建一个新的Editor,你可以修改preferences的数据并且提交给SharedPreferences对象SharedPreferences接口本身并没有提供写入数据的能力，而是通过SharedPreferences的内部接口，SharedPreferences调用edit()方法即可获取它所对应的Editor对象。

            SharedPreferences.Editor editor = sharedPreferences.edit();
            editor.putBoolean("fist_into", true);
            //注意需要commit后才可以进行真正的添加数据
            editor.commit();
        }

        MyLog.e("手机型号:", android.os.Build.MODEL);
        Default.PHONE_MODEL = android.os.Build.MODEL;
        Default.OS_VERSION = android.os.Build.VERSION.RELEASE + "";
        MyLog.e("手机型号:", "" + Default.PHONE_MODEL + "Android版本: " + Default.OS_VERSION +"主板名称: "+ Build.BOARD);
        //Displaymetrics 是取得手机屏幕大小的关键类
        Default.dm = new DisplayMetrics();
        //将当前窗口的一些信息放在DisplayMetrics类中
        getWindowManager().getDefaultDisplay().getMetrics(Default.dm);
        MyLog.e("分辨率：",Default.dm.toString());
        //Handler Handler是在多线程之间使用的，用于线程之间进行通信 提供了一种自有的消息传递机制。
        //为什么需要handler:
        //主线程又称为UI线程。正是因为在android中，所有与UI有关的操作（例如创建UI，刷新UI，处理UI等）都必须在主线程中进行，所以主线程又称为UI 线程
        //如果当一个程序进行下载等操作的时候，需要的时间是非常长的，这时候如果主线程在执行下载量大的工作时，就会被阻塞在当前状态。
        //要解决这种问题，就需要程序再创建一个子线程，即工作线程。让工作线程进行耗费大量时间的操作，而让主线程响应用户的操作。
        //也就是要做到不在主线程中执行可能导致阻塞的耗时代码而是把耗时代码在工作线程中执行。主线程只负责程序的调度和控制
        //首先看Handler有个post（Runnable）的方法，传递一个runnable对象给主线程，runnable中的run方法是在UI线程中执行的。[Android UI操作并不是线程安全的并且这些操作必须在UI线程中执行]
        //利用Handler来实现UI线程的更新的
        // handler中使用handleMessage来获得子线程的内容。在子线程中使用 Message msg = Message.obtain();从消息池中获取得到Message对象
        // msg.what=1;//设置数据 handler.sendMessage(msg);//并向主线程发送数据
        /*
         *TonicGB:主线程获取子线程的数据
         */
        handler=new Handler(){
            @Override
            public void handleMessage(Message msg) {
                super.handleMessage(msg);
                int what = msg.what;
                MyLog.e("主线程","this is"+what);


            }
        };
        /*
         * TonicGB:广播接收器
         * android 注册广播方式两种：
         * 1.常驻型广播:当应用程序关闭了，如果有广播信息来，写的广播接收器同样的能接收到它的注册方式就是在应用程序的AndroidManifast.xml 中进行注册，这种注册方式通常又被称作静态注册。这种方式可以理解为通过清单文件注册的广播是交给操作系统去处理的
         *  <receiver android:name=".broadcast.TonicBroadcast">
            <intent-filter >
                <action android:name="com.example.BROADCAST"/>
            </intent-filter>
           </receiver>
         * 2.非常驻型广播 ：非常驻型广播，当应用程序结束了，广播自然就没有了，比如在 Activity 中的 onCreate 或者 onResume 中注册广播接收者，在 onDestory 中注销广播接收者。这样广播接收者就一个非常驻型的了，这种注册方式也叫动态注册。这种方式可以理解为通过代码注册的广播是和注册者关联在一起的。比如写一个监听 SDcard 状态的广播接收者：
         * BluetoothBroadcast listener=new BluetoothBroadcast();
		 IntentFilter filter2 = new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED); //用来过滤系统的其他广播。指明接受的意图
		registerReceiver(listener, filter2);	//动态注册广播接收器
         *Intent可以启动一个Activity,也可以启动一个Service,还可以发起一个广播Broadcasts.
         */
        startPic.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                Intent intent=new Intent();
                intent.setAction("com.example.BROADCAST");//// 添加Action属性
                intent.putExtra("msg","这是广播发送的信息"); //附带内容
                sendBroadcast(intent);  //发送广播
                /*Toast.makeText(MainLogoActivity.this, "海大力", Toast.LENGTH_SHORT).show();*/
            }
        });




        new Handler().postDelayed(new Runnable() {

            @Override
            public void run() {
                //判断网络是否可用
                if (NetWorkStatusBroadcastReceiver.netWorkAviable) {
                    /*TonicGB:测试在子线程中向住线程传递数据
                    Message msg = Message.obtain();
                    msg.what=1;
                    handler.sendMessage(msg);*/
                    //联网获取启动图
                     doHttpGetHeadImage();

                }else{
                    //没网状态下直接进入主界面
                    stop();
                }
            }
        }, 700);


        Default.isAlive = true;




    }

    @Override
    public void initView() {

    }

    @Override
    public void initData() {

    }

    @Override
    public void initEvent() {

    }


    public void stop() {
        // time.cancel();
        // time.purge();

        Intent intent = null;
        //如果fist_into获得的默认值是 false。也就是说如果fist_info的是true继续走，没有设置过设置默认值false走下面的
        if (sharedPreferences.getBoolean("fist_into", false)) {
            //如果已经打开过了会存入数据为存入数据,进入导航页
            intent = new Intent(MainLogoActivity.this, LoadIntroduceActivity.class);
        } else {
            //在两个activity之间传值, 创建需要启动的Activity对应的Intent
            intent = new Intent(MainLogoActivity.this, MainTabActivity.class);
        }

        // Intent // 启动intent对应的Activity  ;
        startActivity(intent);
        //Activity.finish()方法
        /*在你的activity动作完成的时候，或者Activity需要关闭的时候，调用此方法，当你调用此方法的时候，
        系统只是将最上面的Activity移出了栈，并没有及时的调用onDestory()方法，其占用的资源也没有被及时释放。
        因为移出了栈，所以当你点击手机上边的“back” 按键的时候，也不会再找到这个Activity.*/

        MainLogoActivity.this.finish();

        //这个是一个activity切换到另一个activity时的动画,包含第一个的退出和第二个动画的进入
        // 它必需紧挨着startActivity()或者finish()函数之后调用"
        //第一个是下一个页面进入动画xml，第二个是本页退出的动画xml 两个的时间最好相等
        overridePendingTransition(R.anim.light_to_dark, R.anim.dark_to_light);
        /*overridePendingTransition(R.anim.left_to_right,R.anim.to_right);*/
       // finish();
    }


    /**
     * 获取启动图
     * JsonHttpResponseHandler 继承自TextHttpResponseHandler，同样是重写onSuccess和onFailure方法，将请求结果由String转换为JSONObject或JSONArray，还有onStart，onFinish等消细
     */
    public void doHttpGetHeadImage() {
        //JsonBuilder能将数据以键值对的形式存储,能够输出json格式
        JsonBuilder builder = new JsonBuilder();

        builder.put("type", "3");//type=1请求的是积分商城头部图片，2是首页顶部图片,3是启动图
        //
        BaseHttpClient.post(this, Default.bannerHead, builder, new JsonHttpResponseHandler() {

            @Override
            public void onStart() {
                super.onStart();
                Log.i("onStart", "图片get");
                // showLoadingDialogNoCancle("请稍后努力加载中...");
            }

            @Override
            public void onSuccess(int statusCode, Header[] headers, JSONObject json) {
                // TODO Auto-generated method stub
                super.onSuccess(statusCode, headers, json);
                Log.i("Banner", "图片get"+json.toString());
                //dismissLoadingDialog();

                if (statusCode == 200) {
                    try {
                        if (json.getInt("status") == 1) {
                            JSONObject jsonObject = json.getJSONObject("0");
                            initHeadData(jsonObject);
                            Log.i("BBB", "执行了-----------------");

                        } else {
                            // showCustomToast(json.getString("message"));

                        }

                        //dismissLoadingDialog();
                    } catch (JSONException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }


                }
            }



            @Override
            public void onFailure(int statusCode, Header[] headers, Throwable throwable, JSONObject errorResponse) {
                // TODO Auto-generated method stub
                super.onFailure(statusCode, headers, throwable, errorResponse);
                 //如果没有加载成功默认给一个东东
                Log.i("Banner", "banner post is faile"+statusCode);
                startPic.setBackgroundResource(R.mipmap.b_back);
                startThread();
            }
        });

    }

    /**
     * Picasso.with()来进行一系列初始化[简单的多线程单例模式；同时使用Buidler模式来创建Picasso实例]
     * into将图片加载到相应的控件中。附带回调函数成功的话会执行success
     * @param json
     */
    private void initHeadData(JSONObject json) {
        // TODO Auto-generated method stub
        try {
            String url=Default.ip+json.getString("pic").replace("\\/", "/");
            Log.i("BBB", "TUPIANDIZHI-------------"+url);
            //给某个试图加载设置url图片占位符图片的使用
            Picasso.with(MainLogoActivity.this).load(url).into(startPic,new Callback(){



                @Override
                public void onError() {
                    startPic.setBackgroundResource(R.mipmap.b_back);
                    startThread();

                }

                @Override
                public void onSuccess() {
                    // TODO Auto-generated method stub
                    //startThread();
                    mSendPhoneNum.setVisibility(View.VISIBLE);
                    mSendPhoneNum.setClickable(true);
                    time = new MainLogoActivity.TimeCount(4000, 1000);
                    time.start();


                }



            });
        } catch (JSONException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

    private void startThread(){
        new Handler().postDelayed(new Runnable() {

            @Override
            public void run() {
                stop();
            }
        }, 4000);

    }


    /*
    CountDownTimer 倒计时类
    倒计时类 */
    class TimeCount extends CountDownTimer {
        //用对象timeCount.start()&timeCount.cancel()控制开始结束

        public TimeCount(long millisInFuture, long countDownInterval) {
            super(millisInFuture, countDownInterval);// 参数依次为总时长,和计时的时间间隔
        }

        /**
         * 计时结束调用onfinsh方法
         */
        @Override
        public void onFinish() {
            //mSendPhoneNum.setText("即将进入");
            //mSendPhoneNum.setClickable(true);
            time.cancel();
            stop();
        }

        /**
         * 每隔1s调用onTick
         * @param millisUntilFinished
         */
        @Override
        public void onTick(long millisUntilFinished) {// 计时过程显示
            //mSendPhoneNum.setClickable(false);
            mSendPhoneNum.setText("let's 跳过("+(millisUntilFinished / 1000)+ "秒)");

        }
    }


    @Override
    public void onClick(View arg0) {
        // TODO Auto-generated method stub
        time.cancel(); //取消当前的任务
        stop();
    }


}
